/**
 * @author 黄淮杰
 */
// 闰年月份天数数组
let month_leap = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// 非闰年月份天数数组
let month_normal = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// 月份名字数组
let month_name = ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"];

// 为元素创建变量，方便后续引用
let holder = $("#days");
let prev = $("#prev");
let next = $("#next");
let title = $("#calendar-title");
let year = $("#calendar-year");

// 获取当前的日期时间(分别获取年月日)
let now_date = new Date();
let now_year = now_date.getFullYear();
let now_month = now_date.getMonth();
let now_day = now_date.getDate();

// 获取某月的总天数
// 计算某年是不是闰年
// 条件1：年份必须要能被4整除
// 条件2：年份不能是整百数
// 条件3：年份是400的倍数
function daysMonth(month, year) {
    let tmp = (year % 4 === 0) && (year % 100 !== 0 || year % 400 === 0);
    if (tmp === true) {
        return (month_leap[month]); // 返回闰年的数组
    } else {
        return (month_normal[month]); // 返回非闰年的数组
    }
}

// 获取某月的上一月的总天数
function daysPrevMonth(month, year) {
    if (month === 0) {
        year -= 1;
    }
    return daysMonth(month, year);
}

// 获取某年某月第一天是星期几
function dayStart(month, year) {
    let tmpDate = new Date(year, month, 1); // 日为1，指获取指定年月的第一天
    return (tmpDate.getDay()); // 获取第一天是星期几
}

// 获取某年某月最后一天是星期几
function dayEnd(month, year) {
    let totalDays = daysMonth(month, year);
    let tmpDate = new Date(year, month, totalDays + 1); // 日为1，指获取指定年月的第一天
    return (tmpDate.getDay()); // 获取最后一天是星期几
}

//获取上个月的年月
function getLastMonth() {
    let year = now_year;
    let month = now_month;
    if (now_month === 0) {
        year = now_year - 1;
        month = 12;
    }
    return year + "-" + month + "-";
}

//获取下个月的年月
function getNextMonth() {
    let year = now_year;
    let month = now_month + 2;
    if (now_month === 11) {
        year = now_year + 1;
        month = 1;
    }
    return year + "-" + month + "-";
}

// 生成日期
function initialDate() {
    let str = "";
    let totalDay = daysMonth(now_month, now_year); //获取该月总天数
    let prevTotalDay = daysPrevMonth(now_month, now_year); //获取上个月总天数
    let firstDay = dayStart(now_month, now_year); //获取该月第一天是星期几
    let lastDay = dayEnd(now_month, now_year); //获取该月最后一天是星期几
    let myClass;
    // 生成上个月的日期
    for (let i = firstDay + 1; i >= 1; i--) {
        let tmpDay = prevTotalDay - i + 1;
        str += '<li class="prev-day" data-date="' + getLastMonth() + tmpDay + '">' + tmpDay +
            '</li>'; //为起始日之前的日期创建空白节点
    }

    // 生成这个月的日期
    for (let i = 1; i <= totalDay; i++) {
        if (i === now_day && now_year === now_date.getFullYear() && now_month === now_date.getMonth()) {
            myClass = "class='theme-color active'"; //当天日期以主题色背景突出显示
        } else {
            myClass = "class='lightgrey'"; //其余以深灰字体显示
        }
        let month = now_month + 1;
        let today = now_year + "-" + month + "-" + i;
        str += "<li " + myClass + ' data-date="' + today + '">' + i +
            "</li>"; //创建日期节点
    }
    // 生成下个月的日期
    for (let i = 1; i <= 7 - lastDay - 1; i++) {
        str += '<li class="next-day" data-date="' + getNextMonth() + i + '">' + i +
            '</li>'; //为起始日之前的日期创建空白节点
    }

    // 渲染到页面
    holder.innerHTML = str; //设置日期显示
    title.innerHTML = month_name[now_month]; //设置月份显示
    year.innerHTML = now_year; //设置年份显示
}

// 点击上一月
prev.onclick = function (e) {
    e.preventDefault();
    now_month--;
    if (now_month < 0) {
        now_year--;
        now_month = 11;
    }
    initialDate();
};

// 点击下一月
next.onclick = function (e) {
    e.preventDefault();
    now_month++;
    if (now_month > 11) {
        now_year++;
        now_month = 0;
    }
    initialDate();
};

initialDate();
